﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Mvp.DTO;
using Mvp.WebControl;
using Mvp.Presenter;

namespace View
{
    /*
     * 通常情况下,我们会在后置代码中写DropDownList的PostBack事件,
     * 并且设置根据得到的数据填充三个Literal控件的Text属性。
     * 而在MVP模式中,这部分的工作将会交由提供器来完成。
     * 所以,我们只需要为这些控件建立Set访问器,
     * 并且将页面的引用传给提供器就可以了(如何传递页面引用给提供器后面会讨论)。
     * 我们现在在页面的后置代码中添加一组Set属性,分别去为页面的三个Literal控件赋值
     */

    /*
     * 通常情况下DropDownList的填充也是在后置代码中完成的,而为了能让提供器对DropDownList的数据进行填充,
     * 我们需要让这个DropDownList能够与ILookupList联系起来,并进一步通过调用来自Task中的ILookupCollection的
     * BindTo()方法,来对列表进行绑定。
     * 记得到现在为止我们都没有实现ILookupList接口,现在是时候实现它了,
     * 新建一个项目WebControl,添加对DTO的引用,然后创建ILookupList接口的实现WebLookupList。
     * 在对ILookupList接口的实现中,对DropDownList进行包装,
     * 为了更好的代码重用,我们传递DropDownList的基类ListControl,而非DropDownList本身
     */

    /*
     * 记住:我们期望能让提供器送数据的所有Web页面上的控件,都应该为提供器提供一个入口,
     * 在前面,我们为三个Literal空间提供的入口是Set属性。
     * 这里我们一样需要提供一个Get属性,来让提供器能够获得一个ILookupList
     */

    public partial class _Default : System.Web.UI.Page, IViewBook
    {
        private ViewBookPresenter _presenter;

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            _presenter = new ViewBookPresenter(this);

            ddlBook.SelectedIndexChanged += delegate
            {
                _presenter.DisplayBookDetails();
            };
        }

        protected void Page_Load(object sender,EventArgs e)
        {
            if (!IsPostBack)
            {
                _presenter.Initialize();
            }
        }

        #region IViewBook 成员

        public ILookupList BookList
        {
            get { return new WebLookupList(ddlBook); }
        }

        public string BookTitle
        {
            set { this.ltrTitle.Text = value; }
        }

        public string PubDate
        {
            set { this.ltrPubDate.Text = value; }
        }

        public string Price
        {
            set { this.ltrPrice.Text = value; }
        }

        #endregion
    }
}
